package com.twq.collection.framework

import java.io.{BufferedReader, File, FileReader}

/**
 * Created by tangweiqun on 2017/12/10.
 */
object WhyTraversable {
  def main(args: Array[String]): Unit = {
    //1、Iterable缺点一：有一些非标准的集合很难实现外部迭代器，就比如：FileLineTraversable
    //FileLineTraversable需要知道迭代是否已经完成，完成的话则需要关闭资源，这个利用外部迭代器很难做到
    //所以继承Iterable的都是标准的集合

  }
}


class FileLineTraversable(file: File) extends Traversable[String] {
  //1、trait Traversable就定义了一个接口，就是foreach
  //这个属于内部迭代，无法提供高效的随机访问能力
  override def foreach[U](f: (String) => U): Unit = {
    println("Opening file")
    val input = new BufferedReader(new FileReader(file))
    try {
      var line = input.readLine()
      while (line != null) {
        f(line)
        line = input.readLine()
      }
      println("Done iteration file")
    } finally {
      println("Closing file")
      input.close()
    }
  }

  override def toString(): String = s"{Lines of ${file.getAbsolutePath}}"
}
